#region Includes

using System;

#endregion

namespace HtmlAgilityPack
{
	internal class HtmlCmdLine
	{
		internal static bool Help;

		static HtmlCmdLine()
		{
			Help = false;
			ParseArgs();
		}

		internal static string GetOption(string name, string def)
		{
			string p = def;
			string[] args = Environment.GetCommandLineArgs();
			for (int i = 1; i < args.Length; i++)
			{
				GetStringArg(args[i], name, ref p);
			}
			return p;
		}

		internal static string GetOption(int index, string def)
		{
			string p = def;
			string[] args = Environment.GetCommandLineArgs();
			int j = 0;
			for (int i = 1; i < args.Length; i++)
			{
				if (GetStringArg(args[i], ref p))
				{
					if (index == j)
						return p;
					else
						p = def;
					j++;
				}
			}
			return p;
		}

		internal static bool GetOption(string name, bool def)
		{
			bool p = def;
			string[] args = Environment.GetCommandLineArgs();
			for (int i = 1; i < args.Length; i++)
			{
				GetBoolArg(args[i], name, ref p);
			}
			return p;
		}

		internal static int GetOption(string name, int def)
		{
			int p = def;
			string[] args = Environment.GetCommandLineArgs();
			for (int i = 1; i < args.Length; i++)
			{
				GetIntArg(args[i], name, ref p);
			}
			return p;
		}

		private static void ParseArgs()
		{
			string[] args = Environment.GetCommandLineArgs();
			for (int i = 1; i < args.Length; i++)
			{
				// help
				GetBoolArg(args[i], "?", ref Help);
				GetBoolArg(args[i], "h", ref Help);
				GetBoolArg(args[i], "help", ref Help);
			}
		}

		private static bool GetStringArg(string Arg, ref string ArgValue)
		{
			if (('/' == Arg[0]) || ('-' == Arg[0]))
				return false;
			ArgValue = Arg;
			return true;
		}

		private static void GetStringArg(string Arg, string Name, ref string ArgValue)
		{
			if (Arg.Length < (Name.Length + 3)) // -name:x is 3 more than name
				return;
			if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
				return;
			if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
				ArgValue = Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2);
		}

		private static void GetBoolArg(string Arg, string Name, ref bool ArgValue)
		{
			if (Arg.Length < (Name.Length + 1)) // -name is 1 more than name
				return;
			if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
				return;
			if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
				ArgValue = true;
		}

		private static void GetIntArg(string Arg, string Name, ref int ArgValue)
		{
			if (Arg.Length < (Name.Length + 3)) // -name:12 is 3 more than name
				return;
			if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
				return;
			if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
			{
				try
				{
					ArgValue = Convert.ToInt32(Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2));
				}
				catch
				{
				}
			}
		}
	}
}